package com.turing.post.cardmanagement.util;

import java.math.BigInteger;
import java.util.Date;
import java.util.List;

import javax.ejb.Local;
import javax.ejb.Remote;

import com.turing.post.util.PCPSApplicationException;
import com.turing.post.util.PCPSWebInput;

/**
 * 激活卡数据访问接口定义
 * 
 * @author yxb
 * 
 */

@Remote
@Local
public interface ActivateCardDao {

	/**
	 * 插入
	 * 
	 * @param ActivateCard
	 *            对象
	 * @throws PCPSApplicationException
	 */
	public void insert(ActivateCard ac) throws PCPSApplicationException;

	/**
	 * 修改
	 * 
	 * @param ActivateCard
	 *            对象
	 * @throws PCPSApplicationException
	 */
	public void update(ActivateCard ac) throws PCPSApplicationException;

	/**
	 * 删除
	 * 
	 * @param ActivateCard
	 *            对象
	 * @throws PCPSApplicationException
	 */
	public void remove(ActivateCard ac) throws PCPSApplicationException;

	/**
	 * 根据卡2、3磁道信息获取激活卡对象
	 * 
	 * @param cardNo
	 *            卡号
	 * @return
	 */
	public ActivateCard getActivateCardByTrack23(String track2, String track3);

	/**
	 * 根据卡号获取激活卡对象
	 * 
	 * @param cardNo
	 *            卡号
	 * @return
	 */
	public ActivateCard getActivateCardByCardNo(String cardNo);

	/**
	 * 根据卡号获取激活卡对象
	 * 
	 * @param cardNo
	 *            卡号或卡序号
	 * @return
	 */
	public ActivateCard getActivateCardByCardNoOrSeqNo(String cardNo);

	/**
	 * 根据卡序号获取激活卡对象
	 * 
	 * @param cardSeqNo
	 *            卡序列号
	 * @return
	 */
	public ActivateCard getActivateCardByCardSeqNo(String cardSeqNo);

	/**
	 * 以锁定方式根据卡号获取激活卡对象
	 * 
	 * @param cardNo
	 *            卡号
	 * @return
	 */
	public ActivateCard getActivateCardByCardNoForUpdate(String cardNo);

	/**
	 * 因密码错,更新密码错误计数
	 * 
	 * @param cardNo
	 *            卡号
	 * @return
	 */
	public void incPwdErrCnt(String CardNo);

	/**
	 * 复位密码错误计数
	 * 
	 * @param cardNo
	 *            卡号
	 * @return
	 */
	public void resetPwdErrCnt(String CardNo);

	/**
	 * 销售单所销售卡库存列表，用于自动产生实名excel使用
	 * 
	 * @param startCardSeqNo
	 *            开始序列号
	 * @param endCardSeqNo
	 *            结束序列号
	 * @param batchNo
	 *            批次号
	 * @return ActivateCard对象集合
	 */
	public List<ActivateCard> getActivateCardListByCardSeqNo(
			String startCardSeqNo, String endCardSeqNo, String batchNo);

	/**
	 * 根据批次号、卡顺序号验证卡是否存在激活卡库存里
	 * 
	 * @param batchNo
	 *            批次号
	 * @param cardSeqNo
	 *            卡顺序号
	 * @return ActivateCard对象
	 */
	public ActivateCard checkCardExistInActivateCard(String batchNo,
			String cardSeqNo);

	/**
	 * 根据销售单ID检索激活卡列表
	 * 
	 * @param saleOrderId
	 *            销售单ID
	 * @return ActivateCard 对象集合
	 */
	public List<ActivateCard> getAllActivateCardListBySaleOrderId(
			BigInteger saleOrderId);

	/**
	 * 置空主帐号
	 * 
	 * @param cardNo
	 */
	public void clearMasterAccNo(String cardNo);

	/**
	 * 判断登录人输入卡号或者卡顺序号是否属于该发卡商
	 * 
	 * @param issueCompanyNo
	 * @param cardNo
	 * @return
	 */
	public boolean checkOperIsInIssueCompany(String issueCompanyNo,
			String cardNo);

	/**
	 * 设置激活卡表数据null
	 * 
	 * @param sql
	 * @throws PCPSApplicationException
	 */
	public void setTableFieldIsNull(String sql) throws PCPSApplicationException;

	/**
	 * 根据卡号判断卡状态是否正常
	 * 
	 * @param ac
	 * @return
	 */
	public boolean checkCardStatusIsNormal(ActivateCard ac);

	/**
	 * 卡-14：过期卡明细表
	 * 
	 * @param webInput
	 * @return
	 */
	public List<Object[]> getExpiredCardDetailByCondition(
			PCPSWebInput webInput, String serchBranchNo);

	/**
	 * 卡-14：过期卡统计表
	 * 
	 * @param webInput
	 * @return
	 */
	public List<Object[]> getExpiredCardCountByCondition(PCPSWebInput webInput,
			String serchBranchNo);

	/**
	 * 根据2、3磁道查询卡号，卡序号
	 * 
	 * @param webInput
	 * @param mode
	 *            mode=null 先查询cardstock 再查询activatecard mode=1 查询cardstock
	 *            mode=2 查询 activatecard
	 * @param track2
	 *            2磁道
	 * @param track3
	 *            3磁道
	 * @return
	 */
	public String[] getCardNoByTrack23(PCPSWebInput webInput, String mode,
			String track2, String track3);

	/**
	 * 持卡人账户报表
	 * 
	 * @param webInput
	 * @return
	 */
	public List<Object[]> getActivatecardByOwnerAll(PCPSWebInput webInput);

	public void updateActivateCardPwd(Integer key, Integer count,
			String issueCompanyNo) throws PCPSApplicationException;

	/**
	 * 获取同一持卡人不同卡号集合
	 * 
	 * @return
	 */
	public List<Object[]> getActivateCardsOwnerInfo(String issueCompanyNo);

	/**
	 * 获取同一持卡人不同卡号与主账号集合
	 * 
	 * @return
	 */
	public List<Object[]> getActivateCardsMasterAccOwnerInfo(
			String issueCompanyNo);

	/**
	 * 西邮寄卡残值明细表
	 * 
	 * @param webInput
	 * @param saleBranchNo
	 * @param balanceUpperLimit
	 * @return
	 */
	public List<Object[]> getActivateCardsResidualDetail(String isSingle,
			String saleBranchNo, BigInteger balanceUpperLimit);

	/**
	 * 西邮寄卡残值统计表
	 * 
	 * @param webInput
	 * @param saleBranchNo
	 * @param balanceUpperLimit
	 * @return
	 */
	public List<Object[]> getActivateCardsResidualStatistics(String isSingle,
			String saleBranchNo, BigInteger balanceUpperLimit);

	/**
	 * 账户管理费收入明细表
	 * 
	 * @param webInput
	 * @param saleBranchNo
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public List<Object[]> getCardAccountManagementFeeDetail(String isSingle,
			String saleBranchNo, Date startDate, Date endDate);

	/**
	 * 账户管理费收入统计表
	 * 
	 * @param webInput
	 * @param saleBranchNo
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public List<Object[]> getCardAccountManagementFeeStatistics(
			String isSingle, String saleBranchNo, Date startDate, Date endDate);

	/**
	 * 修改激活卡密码
	 * 
	 * @param cardNo
	 * @throws PCPSApplicationException
	 */
	public void updateActivateCardPwdByCardNo(String cardNo)
			throws PCPSApplicationException;

	/**
	 * 根据批次号获取激活卡总数
	 * 
	 * @param batchNo
	 * @return
	 */
	public int getActivateCardTotalCountByBatchNo(String batchNo);
}
